目录
转载请注明出处:bestsort.cn
树状数组基础
树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改&&区间求和.
另外一个拥有类似功能的是线段树.
具体区别和联系如下:
1.两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.
2.树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.
3.树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,其代码效率远高于线段树。
上面出现了一个新名词:lowbit.其实lowbit(x)就是求x最低位的1;
下面加图进行解释
对于一般的二叉树,我们是这样画的
把位置稍微移动一下,便是树状数组的画法
一图秒懂
重头戏来了,bestsort教你一图学会树状数组~(咱也不知道为啥其他博客写那么复杂
需要注意的是,图中的子节点包括自己,比如说8这个节点,里面的值是原始数组中[5,8]的和
标记为灰色的节点实际已被上层覆盖,不占据空间
下面是二进制版本,能看到
更新过程是每次加了个二进制的低位1(101+1 ->110, 110 + 10 -> 1000, 1000 + 1000 -> 10000)
查询过程每次